2023/12/233245字符
二叉树的遍历
function Node (value) {
this.value = value;
this.left = null;
this.right = null;
}
const a = new Node('a');
const b = new Node('b');
const c = new Node('c');
const d = new Node('d');
const e = new Node('e');
const f = new Node('f');
const g = new Node('g');
a.left = b;
a.right = c;
b.left = d;
b.right = e;
c.left = f;
c.right = g;
a
b c
d e f g
前序遍历(先根次序遍历)
- 先打印当前的,再打印左边的,再打印右边的。( a - b - d - e - c - f - g )
function f1 (root) {
if (root == null) return;
console.log(root.value);
f1(root.left);
f1(root.right);
}
f1(a); //--> a b d e c f g
中序遍历(中跟次序遍历)
- 先打印左边的,再打印当前的,再打印右边的。( d - b - e - a - f - c - g )
function f2 (root) {
if (root == null) return;
f2(root.left);
console.log(root.value);
f2(root.right);
}
f2(a); //--> d b e a f c g
后序遍历(后根次序遍历)
- 先打印左边的,再打印右边的,再打印当前的。( d - e - b - f - g - c - a )
function f3 (root) {
if (root == null) return;
f3(root.left);
f3(root.right);
console.log(root.value);
}
f3(a); //--> d e b f g c a
根据 前序中序 还原二叉树
const qian = ['a', 'b', 'd', 'e', 'c', 'f', 'g'];
const zhong = ['d', 'b', 'e', 'a', 'f', 'c', 'g'];
function restore (front, middle) {
if (front == null || middle == null || front.length == 0 || middle.length == 0 || front.length != middle.length) return null;
const root = new Node(front[0]);
const index = middle.indexOf(root.value); // 找到根节点在中序遍历中的位置
const frontLeft = front.slice(1, index + 1);
const frontRight = front.slice(index + 1);
const middleLeft = middle.slice(0, index);
const middleRight = middle.slice(index + 1);
root.left = restore(frontLeft, middleLeft); // 还原左子树
root.right = restore(frontRight, middleRight); // 还原右子树
return root;
}
function Node (value) {
this.value = value;
this.left = null;
this.right = null;
}
restore(qian, zhong); //-->
根据 中序后序 还原二叉树
const zhong = ['d', 'b', 'e', 'a', 'f', 'c', 'g'];
const hou = ['d', 'e', 'b', 'f', 'g', 'c', 'a'];
function restore (middle, after) {
if (middle == null || after == null || middle.length == 0 || after.length == 0 || middle.length != after.length) return null;
const root = new Node(after[after.length - 1]);
const index = middle.indexOf(root.value);
const middleLeft = middle.slice(0, index);
const middleRight = middle.slice(index + 1);
const afterLeft = after.slice(0, index);
const afterRight = after.slice(index, -1);
root.left = restore(middleLeft, afterLeft);
root.right = restore(middleRight, afterRight);
return root;
}
function Node (value) {
this.value = value;
this.left = null;
this.right = null;
}
restore(zhong, hou); //-->